package com.zjut.an.util.tools;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;

import com.zjut.an.news.dao.AnNews;
import com.zjut.an.news.manager.AnNewsManager;

@Controller
public class HitUtil {

	@Resource(name = "AnNewsManager")
	private AnNewsManager manager;
	
	private AnNews news;
	private Timer timer;
	//利用一个静态变量来记录Singleton类的唯一实例   
    private static HitUtil uiqueInstance; 
    
    private Map hitMap;
    //把构造函数声明为私有的，外部不可以实例化，只有内部可以实例化   
    private HitUtil(){  
    	hitMap = new HashMap();
    	timer = new Timer();
    	timer.schedule(new RemindTask(),
                0,        //initial delay
                10*60*1000);  //10分钟调用一次
    }  
      
    //外部通过调用静态方法getInstance()，来获得实例化对象     
    public static HitUtil getInstance(){  
        //内部自己管理实例，始终保证只有一个实例   
        if(uiqueInstance == null) {  
            //如果没有实例，则创建实例，在类的内部可以访问构造函数，进而实例化   
        	uiqueInstance = new HitUtil();  
        }   
        //如果已经存在就直接将实例返回就行了   
        return uiqueInstance;  
    } 
    
    public int hit(Integer neId) {
    	if (!hitMap.containsKey(neId)) {
    		news = manager.getData(neId);
    		int nhit = news.getHit()+1;
    		hitMap.put(neId, nhit);
    		return nhit;
    	} else {
    		int nhit = (Integer)hitMap.get(neId);
    		nhit++;
    		hitMap.put(neId, nhit);
    		return nhit;
    	}
    }
    
    public int getHit(Integer neId) {
    	if (!hitMap.containsKey(neId)) {
    		news = manager.getData(neId);
    		int nhit = news.getHit();
    		hitMap.put(neId, nhit);
    		return nhit;
    	} else {
    		int nhit = (Integer)hitMap.get(neId);
    		hitMap.put(neId, nhit);
    		return nhit;
    	}
    }
    
    class RemindTask extends TimerTask {//执行保存点击率数据操作
        public void run() {
        	if(null==manager)manager=new AnNewsManager();
        	if(null==hitMap)hitMap=new HashMap();
            try {
				manager.saveHit(hitMap);
			} catch (Exception e) {
				e.printStackTrace();
			}
        }
    }
}


